简单区分Kubernetes中的不同port。
containerPort vs. hostPort
出现在如Deployment、Pod等资源对象描述文件中的容器部分,针对容器端口起类似于docker run -p <containerPort>:<hostPort>
的作用:containerPort
:容器暴露的端口。hostPort
:容器暴露的端口直接映射到的主机端口。1
2
3
4
5
6
7
8
9
10
11
12
13
14apiVersion: extensions/v1beta1
kind: Deployment
...
spec:
...
template:
spec:
containers:
- name: tomcat
image: tomcat:8
ports:
- containerPort: 8080
hostPort: 80
...
此时,用户可以直接访问宿主机的80端口访问容器。
port vs. targetPort vs. nodePort
出现在Service描述文件中,当Service的类型为ClusterIP
时:port
:Service中ClusterIP对应的端口。targetport
:clusterIP作为负载均衡, 后端目标实例(容器)的端口,与上述containerPort
保持一致。1
2
3
4
5
6
7
8
9
10
11
12
13apiVersion: v1
kind: Service
metadata:
...
name: tomcatapp
spec:
...
type: ClusterIP
ports:
- name: app
protocol: TCP
port: 10080
targetPort: 8080
此时,同一集群的容器可以通过http://tomcatapp:10080
访问该Service。
当Service的类型为NodePort
时:nodePort
:由于ClusterIP只能集群内访问,配置nodePort会在每个运行kubelet
节点的宿主机打开一个端口,用于集群外部访问。1
2
3
4
5
6
7
8
9
10
11
12
13
14apiVersion: v1
kind: Service
metadata:
...
name: tomcatapp
spec:
...
type: NodePort
ports:
- name: app
protocol: TCP
port: 10080
targetPort: 8080
nodePort: 30080
此时,集群外的用户可以通过http://<宿主机IP>:30080
访问;同时,ClusterIP仍然生效,同一集群的容器仍可通过http://tomcatapp:10080
访问该Service。
当然,上述正常访问的前提条件是:相关节点的kube-proxy
正常运行且跨主机容器网络通信正常。